﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace YouDaoNotesCodes
{
    class selfDefine4Section : ConfigurationSection
    {
        #region 自定义节点读取方式4-Collection

        private static readonly ConfigurationProperty s_property
= new ConfigurationProperty(string.Empty, typeof(MyKeyValueCollection), null,
                                ConfigurationPropertyOptions.IsDefaultCollection);

        [ConfigurationProperty("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]
        public MyKeyValueCollection KeyValues
        {
            get
            {
                return (MyKeyValueCollection)base[s_property];
            }
        }
        [ConfigurationCollection(typeof(MyKeyValueSetting))]
        public class MyKeyValueCollection : ConfigurationElementCollection        // 自定义一个集合
        {
            // 基本上，所有的方法都只要简单地调用基类的实现就可以了。

            public MyKeyValueCollection()
                : base(StringComparer.OrdinalIgnoreCase)    // 忽略大小写
            {
            }

            // 其实关键就是这个索引器。但它也是调用基类的实现，只是做下类型转就行了。
            new public MyKeyValueSetting this[string name]
            {
                get
                {
                    return (MyKeyValueSetting)base.BaseGet(name);
                }
            }

            // 下面二个方法中抽象类中必须要实现的。
            protected override ConfigurationElement CreateNewElement()
            {
                return new MyKeyValueSetting();
            }
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((MyKeyValueSetting)element).Key;
            }

            // 说明：如果不需要在代码中修改集合，可以不实现Add, Clear, Remove
            public void Add(MyKeyValueSetting setting)
            {
                this.BaseAdd(setting);
            }
            public void Clear()
            {
                base.BaseClear();
            }
            public void Remove(string name)
            {
                base.BaseRemove(name);
            }
        }
        public class MyKeyValueSetting : ConfigurationElement    // 集合中的每个元素
        {
            [ConfigurationProperty("key", IsRequired = true)]
            public string Key
            {
                get { return this["key"].ToString(); }
                set { this["key"] = value; }
            }

            [ConfigurationProperty("value", IsRequired = true)]
            public string Value
            {
                get { return this["value"].ToString(); }
                set { this["value"] = value; }
            }
        }

        public void readSelfDefine4()
        {
            selfDefine4Section se4 = (selfDefine4Section)ConfigurationManager.GetSection("selfDefine4");
            string res = string.Join("\r\n",
                                       (from kv in se4.KeyValues.Cast<MyKeyValueSetting>()
                                        let s = string.Format("{0}={1}", kv.Key, kv.Value)
                                        select s).ToArray());
            Console.Write(res);
            Console.ReadKey();
        }
        #endregion
        //调用方式4
        public void getSectionByCollection()
        {
            selfDefine4Section dc = (selfDefine4Section)ConfigurationManager.GetSection("selfDefine4");
            string res = string.Join("\r\n",
                                       (from kv in dc.KeyValues.Cast<MyKeyValueSetting>()
                                        let s = string.Format("{0}={1}", kv.Key, kv.Value)
                                        select s).ToArray());
            Console.Write(res);
            Console.ReadKey();
        }

        #region 自定义配置文件写入-方式4
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        public void writeSectionByCollection()
        {
            selfDefine4Section section4 = config.GetSection("selfDefine4") as selfDefine4Section;
            section4.KeyValues.Clear();

            //(from s in txtKeyValues.Lines
            // let p = s.IndexOf('=')
            // where p > 0
            // select new MyKeyValueSetting { Key = s.Substring(0, p), Value = s.Substring(p + 1) }
            //).ToList()
            //.ForEach(kv => section4.KeyValues.Add(kv));

            config.Save();
        }

        #endregion

    }
}
